﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Transactions;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class OrganizacaoDocumento
    {

        #region Variaveis Membro
        private int _idDocumentoOrganizacao;
        private int? _idTipoDocumento;
        private int? _idTipoPagamento;
        private int? _idContrato;
        private int _idOrganizacao;
        private DateTime? _dataGravacao;
        private DateTime? _dataValidade;
        private string _path;
        private string _nomeArquivo;
        private string _ano;
        private string _mes;
        private string _descricao;
        private string _cota;
        private DateTime? _dataDocumento;
        private TipoPagamento _tipoPagamento;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdDocumentoOrganizacao
        {
            get { return _idDocumentoOrganizacao; }
            set { _idDocumentoOrganizacao = value; }
        }
        public int? IdTipoDocumento
        {
            get { return _idTipoDocumento; }
            set { _idTipoDocumento = value; }
        }
        public int? IdTipoPagamento
        {
            get { return _idTipoPagamento; }
            set { _idTipoPagamento = value; }
        }
        public int? IdContrato
        {
            get { return _idContrato; }
            set { _idContrato = value; }
        }
        public int idOrganizacao
        {
            get { return _idOrganizacao; }
            set { _idOrganizacao = value; }
        }
        public DateTime? DataGravacao
        {
            get { return _dataGravacao; }
            set { _dataGravacao = value; }
        }
        public DateTime? DataValidade
        {
            get { return _dataValidade; }
            set { _dataValidade = value; }
        }
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        public string NomeArquivo
        {
            get { return _nomeArquivo; }
            set { _nomeArquivo = value; }
        }
        public string Mes
        {
            get { return _mes; }
            set { _mes = value; }
        }
        public string Ano
        {
            get { return _ano; }
            set { _ano = value; }
        }
        public string Descricao
        {
            get { return _descricao; }
            set { _descricao = value; }
        }
        public string Cota
        {
            get { return _cota; }
            set { _cota = value; }
        }
        public TipoPagamento TipoPagamento
        {
            get { return _tipoPagamento; }
            set { _tipoPagamento = value; }
        }
        public DateTime? DataDocumento
        {
            get { return _dataDocumento; }
            set { _dataDocumento = value; }
        }
        #endregion

        #region Construtores
        public OrganizacaoDocumento()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public OrganizacaoDocumento(int idOrganizacaoDocumento)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idOrganizacaoDocumento);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        protected void Carregar(int idOrganizacaoDocumento)
        {
            try
            {
                var consulta = from td in _context.tab_documento_organizacao
                               where td.id_documento_organ == idOrganizacaoDocumento
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   id_tipo_pagamento = (td.tab_tipo_pagamento.id_tipo_pagamento == null) ? 0 : td.tab_tipo_pagamento.id_tipo_pagamento,
                                   id_contrato = (td.tab_contrato.Id_contrato == null) ? 0 : td.tab_contrato.Id_contrato,
                                   id_organizacao = (td.tab_organizacao.Id_organizacao == null) ? 0 : td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idDocumentoOrganizacao = list.id_documento_organ;
                    this._idTipoDocumento = list.Id_tipo_documento;

                    if (list.id_tipo_pagamento != null)
                    {
                        this._idTipoPagamento = list.id_tipo_pagamento;
                        this._tipoPagamento = new TipoPagamento(list.id_tipo_pagamento);
                    }
                    if (list.id_contrato != null)
                        this._idContrato = list.id_contrato;

                    this._idOrganizacao = list.id_organizacao;
                    this._dataGravacao = list.dt_gravacao;
                    this._dataValidade = list.validade;
                    this._path = list.path;
                    this._descricao = list.descricao;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        protected string ConverteMes(int data)
        {
            string rMes = string.Empty;

            switch (data)
            {
                case 1:
                    rMes = "Janeiro";
                    break;
                case 2:
                    rMes = "Fevereiro";
                    break;
                case 3:
                    rMes = "Março";
                    break;
                case 4:
                    rMes = "Abril";
                    break;
                case 5:
                    rMes = "Maio";
                    break;
                case 6:
                    rMes = "Junho";
                    break;
                case 7:
                    rMes = "Julho";
                    break;
                case 8:
                    rMes = "Agosto";
                    break;
                case 9:
                    rMes = "Setembro";
                    break;
                case 10:
                    rMes = "Outubro";
                    break;
                case 11:
                    rMes = "Novembro";
                    break;
                case 12:
                    rMes = "Dezembro";
                    break;
                default:
                    break;
            }

            return rMes;
        }
        protected int RecuperaId()
        {
            try
            {
                int idDocumento = 0;

                var consulta = from td in _context.tab_documento_organizacao
                               orderby td.id_documento_organ descending
                               select new
                               {
                                   td.id_documento_organ,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    idDocumento = list.id_documento_organ;
                    break;
                }

                return idDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
        {
            if (null == valueSelector)
            {
                throw new
                    ArgumentNullException("valueSelector");
            }
            if (null == values) { throw new ArgumentNullException("values"); }

            ParameterExpression p = valueSelector.Parameters.Single();
            if (!values.Any())
            {
                return e => false;
            }

            var equals = values.Select(value =>
            (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value,
            typeof(TValue))));
            var body = equals.Aggregate<Expression>((accumulate, equal) =>
            Expression.Or(accumulate, equal));
            return Expression.Lambda<Func<TElement, bool>>(body, p);
        }

        private bool VerificaInclusao()
        {
            try
            {
                bool _verificar = false;

                if (this._idTipoDocumento == null)
                    throw new Exception("É necessário informar o tipo de documento!");

                if (this._idTipoDocumento == 0)
                    throw new Exception("É necessário informar o tipo de documento!");

                if (this._idOrganizacao == null)
                    throw new Exception("É necessário informar a organização!");

                if (this._idOrganizacao == 0)
                    throw new Exception("É necessário informar a organização!");

                switch (this._idTipoDocumento)
                {
                    case (int)TipoDocumento.TipoDocto.Folha_Pagamento:
                        if (this._dataValidade == null)
                            throw new Exception("É necessário informar o ano da folha de pagamento!");

                        if (this._descricao == string.Empty)
                            throw new Exception("É necessário informar o mês da folha de pagamento!");

                        if ((this._idTipoPagamento == 0) || (this._idTipoPagamento == null))
                            throw new Exception("É necessário informar o tipo de pagamento!");

                        var consultaTipoPagto = (from doctoorganizacao in _context.tab_documento_organizacao
                                                 where doctoorganizacao.validade == this._dataValidade
                                                 && doctoorganizacao.descricao == this._descricao
                                                 && doctoorganizacao.tab_tipo_pagamento.id_tipo_pagamento == this._idTipoPagamento
                                                 && doctoorganizacao.tab_organizacao.Id_organizacao == this._idOrganizacao
                                                 && doctoorganizacao.tab_tipo_documento.Id_tipo_documento == this._idTipoDocumento
                                                 select new
                                                 {
                                                     doctoorganizacao.id_documento_organ
                                                 });

                        if (consultaTipoPagto.ToList().Count > 0)
                            throw new Exception("Foi encontrado uma Folha de Pagamento para os dados informados. Operação cancelada!");

                        break;

                    case (int)TipoDocumento.TipoDocto.CND_ISS_ISSQN:
                        if (this._dataGravacao == null)
                            throw new Exception("É necessário informar a data de Emissão!");

                        if (this._dataValidade == null)
                            throw new Exception("É necessário informar a quantidade de dias para Validade!");

                        if (this._dataValidade < this._dataGravacao)
                            throw new Exception("Data de Validade não pode ser menor que Data de Emissão!");

                        var consultaCND_ISSISSQN = (from doctoorganizacao in _context.tab_documento_organizacao
                                                    where doctoorganizacao.dt_gravacao == this._dataGravacao
                                                    && doctoorganizacao.validade == this._dataValidade
                                                    && doctoorganizacao.tab_organizacao.Id_organizacao == this._idOrganizacao
                                                    && doctoorganizacao.tab_tipo_documento.Id_tipo_documento == this._idTipoDocumento
                                                    select new
                                                    {
                                                        doctoorganizacao.id_documento_organ
                                                    });

                        if (consultaCND_ISSISSQN.ToList().Count > 0)
                            throw new Exception("Foi encontrado uma CND - ISS/ISSQN para esta data de emissão e validade. Operação cancelada!");
                        break;

                    case (int)TipoDocumento.TipoDocto.CND_INSS:
                    case (int)TipoDocumento.TipoDocto.CND_CRF:
                    case (int)TipoDocumento.TipoDocto.CND_PGFN:
                        if (this._dataGravacao == null)
                            throw new Exception("É necessário informar a data de Emissão!");

                        if (this._dataValidade == null)
                            throw new Exception("É necessário informar a data de Validade!");

                        if (this._dataValidade < this._dataGravacao)
                            throw new Exception("Data de Validade não pode ser menor que Data de Emissão!");

                        var consultaCNDs = (from doctoorganizacao in _context.tab_documento_organizacao
                                            where doctoorganizacao.dt_gravacao == this._dataGravacao
                                            && doctoorganizacao.validade == this._dataValidade
                                            && doctoorganizacao.tab_organizacao.Id_organizacao == this._idOrganizacao
                                            && doctoorganizacao.tab_tipo_documento.Id_tipo_documento == this._idTipoDocumento
                                            select new
                                            {
                                                doctoorganizacao.id_documento_organ
                                            });

                        if (consultaCNDs.ToList().Count > 0)
                            throw new Exception("Foi encontrado uma CND para esta data de emissão e validade. Operação cancelada!");
                        break;

                    case (int)TipoDocumento.TipoDocto.PAT:
                        if (this._dataValidade == null)
                            throw new Exception("É necessário informar a data de Validade!");

                        var consultaPAT = (from doctoorganizacao in _context.tab_documento_organizacao
                                           where doctoorganizacao.validade == this._dataValidade
                                           && doctoorganizacao.tab_organizacao.Id_organizacao == this._idOrganizacao
                                           && doctoorganizacao.tab_tipo_documento.Id_tipo_documento == this._idTipoDocumento
                                           select new
                                           {
                                               doctoorganizacao.id_documento_organ
                                           });

                        if (consultaPAT.ToList().Count > 0)
                            throw new Exception("Foi encontrado uma PAT para esta data de cadastramento/recadastramento. Operação cancelada!");
                        break;

                    case (int)TipoDocumento.TipoDocto.PCMSO:
                    case (int)TipoDocumento.TipoDocto.PPRA:
                    case (int)TipoDocumento.TipoDocto.PSS:
                    case (int)TipoDocumento.TipoDocto.CRSE:
                    case (int)TipoDocumento.TipoDocto.SESMT:
                    case (int)TipoDocumento.TipoDocto.Solidariedade_Fiscal:
                        if (this._dataValidade == null)
                            throw new Exception("É necessário informar o ano e mês do documento. Operação cancelada!");

                        var consultaDiv = (from doctoorganizacao in _context.tab_documento_organizacao
                                           where doctoorganizacao.validade == this._dataValidade
                                           && doctoorganizacao.tab_organizacao.Id_organizacao == this._idOrganizacao
                                           && doctoorganizacao.tab_tipo_documento.Id_tipo_documento == this._idTipoDocumento
                                           select new
                                           {
                                               doctoorganizacao.id_documento_organ
                                           });

                        if (consultaDiv.ToList().Count > 0)
                            throw new Exception("Foi encontrado um documento com o mês e ano informado. Operação cancelada!");
                        break;

                    case (int)TipoDocumento.TipoDocto.RAIS:
                    case (int)TipoDocumento.TipoDocto.DIRF:
                    case (int)TipoDocumento.TipoDocto.Informe_Rendimentos:
                        if (this._descricao == string.Empty)
                            throw new Exception("É necessário informar o ano do documento!");

                        if (this._path == string.Empty)
                            throw new Exception("É necessário informar a imagem do documento!");

                        var consultaAnoRAIS = (from doctoorganizacao in _context.tab_documento_organizacao
                                               where doctoorganizacao.descricao == this._descricao
                                               && doctoorganizacao.tab_organizacao.Id_organizacao == this._idOrganizacao
                                               && doctoorganizacao.tab_tipo_documento.Id_tipo_documento == this._idTipoDocumento
                                               select new
                                               {
                                                   doctoorganizacao.id_documento_organ
                                               });

                        if (consultaAnoRAIS.ToList().Count > 0)
                            throw new Exception("Foi encontrado um ano existente deste documento no sistema para esta organização. Operação cancelada!");
                        break;

                    case (int)TipoDocumento.TipoDocto.CAGED:
                        if (this._descricao == string.Empty)
                            throw new Exception("É necessário informar o ano do CAGED!");

                        if (this._dataValidade == null)
                            throw new Exception("É necessário informar o mês do CAGED!");

                        if (this._path == string.Empty)
                            throw new Exception("É necessário informar o documento do CAGED!");

                        var consultaCAGED = (from doctoorganizacao in _context.tab_documento_organizacao
                                             where doctoorganizacao.descricao==this._descricao
                                             && doctoorganizacao.validade.Value.Month==this._dataValidade.Value.Month
                                             && doctoorganizacao.tab_organizacao.Id_organizacao==this._idOrganizacao
                                             && doctoorganizacao.tab_tipo_documento.Id_tipo_documento==(int)TipoDocumento.TipoDocto.CAGED
                                             select new
                                             {
                                                 doctoorganizacao.id_documento_organ
                                             });

                        if (consultaCAGED.ToList().Count>0)
                            throw new Exception("Foi encontrado um mês/ano existente do CAGED para esta organização. Operação cancelada!");
                        break;

                    case (int)TipoDocumento.TipoDocto.INSS:
                    case (int)TipoDocumento.TipoDocto.INSS_13Salario:
                    case (int)TipoDocumento.TipoDocto.FGTS:
                        if (this._dataValidade == null)
                            throw new Exception("É necessário informar o mês e ano do Encargo do INSS!");

                        if (this._path == string.Empty)
                            throw new Exception("É necessário informar o documento do Encargo do INSS!");

                        var consultaEncINSSFGTS = (from doctoorganizacao in _context.tab_documento_organizacao
                                                   where doctoorganizacao.validade == this._dataValidade
                                                   && doctoorganizacao.tab_organizacao.Id_organizacao == this._idOrganizacao
                                                   && doctoorganizacao.tab_tipo_documento.Id_tipo_documento == this._idTipoDocumento
                                                   select new
                                                   {
                                                       doctoorganizacao.id_documento_organ
                                                   });

                        if (consultaEncINSSFGTS.ToList().Count > 0)
                        {
                            if ((this._idTipoDocumento == (int)TipoDocumento.TipoDocto.INSS) || (this._idTipoDocumento == (int)TipoDocumento.TipoDocto.INSS_13Salario))
                                throw new Exception("Foi encontrado um mês/ano existente do Encargo de INSS para esta organização. Operação cancelada!");
                            else
                                throw new Exception("Foi encontrado um mês/ano existente do Encargo de FGTS para esta organização. Operação cancelada!");
                        }


                        break;
                }

                _verificar = true;
                return _verificar;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodo Publicos

        #region Metodos de Selecao
        public List<OrganizacaoDocumento> SelectAll()
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = from td in _context.tab_documento_organizacao
                               select new
                               {
                                   td.id_documento_organ,
                                   Id_tipo_documento = td.tab_tipo_documento.Id_tipo_documento,
                                   id_tipo_pagamento = td.tab_tipo_pagamento.id_tipo_pagamento,
                                   td.tab_contrato.Id_contrato,
                                   td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    if (list.id_tipo_pagamento != null)
                    {
                        documento.IdTipoPagamento = list.id_tipo_pagamento;
                        documento.TipoPagamento = new TipoPagamento(list.id_tipo_pagamento);
                    }
                    if (list.Id_contrato != null)
                        documento.IdContrato = list.Id_contrato;
                    documento.idOrganizacao = list.Id_organizacao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.Path = list.path;
                    documento.Descricao = list.descricao;

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<OrganizacaoDocumento> SelectPor(int idOrganizacao, int idTipoDocumento)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = from td in _context.tab_documento_organizacao
                               where td.tab_organizacao.Id_organizacao == idOrganizacao
                               && td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento
                               orderby td.validade ascending
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   tipo_pagamento = (td.tab_tipo_pagamento.id_tipo_pagamento == null) ? 0 : td.tab_tipo_pagamento.id_tipo_pagamento,
                                   contrato = (td.tab_contrato.Id_contrato == null) ? 0 : td.tab_contrato.Id_contrato,
                                   organizacao = (td.tab_organizacao.Id_organizacao == null) ? 0 : td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path,
                                   td.dt_documento,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    if (list.tipo_pagamento != null)
                    {
                        documento.IdTipoPagamento = list.tipo_pagamento;
                        documento.TipoPagamento = new TipoPagamento(list.tipo_pagamento);
                    }
                    if (list.contrato != null)
                        documento.IdContrato = list.contrato;
                    documento.idOrganizacao = list.organizacao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.DataDocumento = list.dt_documento;
                    documento.Path = list.path;
                    documento.Descricao = list.descricao;

                    if (list.validade != null || list.validade != DateTime.MinValue)
                    {
                        documento.Ano = DateTime.Parse(list.validade.ToString()).Year.ToString();
                        if (list.Id_tipo_documento == 34 || list.Id_tipo_documento == 37)
                            documento.Mes = "13º.Salário";
                        else if ((list.Id_tipo_documento == 15) && (list.tipo_pagamento == 4) || (list.tipo_pagamento == 5))
                            documento.Mes = "13º.Salário";
                        else
                            documento.Mes = ConverteMes(int.Parse(DateTime.Parse(list.validade.ToString()).Month.ToString()));
                    }

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<OrganizacaoDocumento> SelectPorDtDoc(int idOrganizacao, int idTipoDocumento)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = from td in _context.tab_documento_organizacao
                               where td.tab_organizacao.Id_organizacao == idOrganizacao
                               && td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento
                               orderby td.dt_documento ascending
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   tipo_pagamento = (td.tab_tipo_pagamento.id_tipo_pagamento == null) ? 0 : td.tab_tipo_pagamento.id_tipo_pagamento,
                                   contrato = (td.tab_contrato.Id_contrato == null) ? 0 : td.tab_contrato.Id_contrato,
                                   organizacao = (td.tab_organizacao.Id_organizacao == null) ? 0 : td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path,
                                   td.dt_documento,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    if (list.tipo_pagamento != null)
                    {
                        documento.IdTipoPagamento = list.tipo_pagamento;
                        documento.TipoPagamento = new TipoPagamento(list.tipo_pagamento);
                    }
                    if (list.contrato != null)
                        documento.IdContrato = list.contrato;
                    documento.idOrganizacao = list.organizacao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.DataDocumento = list.dt_documento;
                    documento.Path = list.path;
                    documento.Descricao = list.descricao;

                    if (list.dt_documento != null || list.dt_documento != DateTime.MinValue)
                    {
                        documento.Ano = DateTime.Parse(list.dt_documento.ToString()).Year.ToString();
                        if (list.Id_tipo_documento == 34 || list.Id_tipo_documento == 37)
                            documento.Mes = "13º.Salário";
                        else if ((list.Id_tipo_documento == 15) && (list.tipo_pagamento == 4) || (list.tipo_pagamento == 5))
                            documento.Mes = "13º.Salário";
                        else
                            documento.Mes = ConverteMes(int.Parse(DateTime.Parse(list.dt_documento.ToString()).Month.ToString()));
                    }

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<OrganizacaoDocumento> SelectPor(int idOrganizacao, int idTipoDocumento1, int idTipoDocumento2)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = from td in _context.tab_documento_organizacao
                               where td.tab_organizacao.Id_organizacao == idOrganizacao
                               && (td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento1 || td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento2)
                               orderby td.validade
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   //td.tab_tipo_pagamento.id_tipo_pagamento,
                                   //td.tab_contrato.Id_contrato,
                                   td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    //if (list.id_tipo_pagamento != null)
                    //    documento.IdTipoPagamento = list.id_tipo_pagamento;
                    //if (list.Id_contrato != null)
                    //    documento.IdContrato = list.Id_contrato;
                    documento.idOrganizacao = list.Id_organizacao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.Path = list.path;
                    documento.Descricao = list.descricao;

                    if (list.validade != null || list.validade != DateTime.MinValue)
                    {
                        documento.Ano = DateTime.Parse(list.validade.ToString()).Year.ToString();
                        if (list.Id_tipo_documento == 34 || list.Id_tipo_documento == 37)
                            documento.Mes = "13º.Salário";
                        else
                            documento.Mes = ConverteMes(int.Parse(DateTime.Parse(list.validade.ToString()).Month.ToString()));
                    }

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<OrganizacaoDocumento> SelectPor(int idOrganizacao, int idTipoDocumento, int[] pAnosValidade)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = from td in (pAnosValidade[0] != 0) ? _context.tab_documento_organizacao.Where((BuildContainsExpression<tab_documento_organizacao, int>(item => item.validade.Value.Year, pAnosValidade))) : _context.tab_documento_organizacao
                               where (td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento)
                               && (td.tab_organizacao.Id_organizacao == idOrganizacao)
                               orderby td.validade ascending
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   tipo_pagamento = (td.tab_tipo_pagamento.id_tipo_pagamento == null) ? 0 : td.tab_tipo_pagamento.id_tipo_pagamento,
                                   contrato = (td.tab_contrato.Id_contrato == null) ? 0 : td.tab_contrato.Id_contrato,
                                   organizacao = (td.tab_organizacao.Id_organizacao == null) ? 0 : td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    documento.IdTipoPagamento = list.tipo_pagamento;
                    documento.TipoPagamento = new TipoPagamento(list.tipo_pagamento);
                    documento.IdContrato = list.contrato;
                    documento.idOrganizacao = list.organizacao;
                    documento.Descricao = list.descricao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.Path = list.path;

                    if (list.validade != null || list.validade != DateTime.MinValue)
                    {
                        documento.Ano = DateTime.Parse(list.validade.ToString()).Year.ToString();
                        if (list.Id_tipo_documento == 34 || list.Id_tipo_documento == 37)
                            documento.Mes = "13º.Salário";
                        else if ((list.Id_tipo_documento == 15) && (list.tipo_pagamento == 4) || (list.tipo_pagamento == 5))
                            documento.Mes = "13º.Salário";
                        else
                            documento.Mes = ConverteMes(int.Parse(DateTime.Parse(list.validade.ToString()).Month.ToString()));
                    }

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<OrganizacaoDocumento> SelectPorDtDoc(int idOrganizacao, int idTipoDocumento, int[] pAnosValidade)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = from td in (pAnosValidade[0] != 0) ? _context.tab_documento_organizacao.Where((BuildContainsExpression<tab_documento_organizacao, int>(item => item.dt_documento.Value.Year, pAnosValidade))) : _context.tab_documento_organizacao
                               where (td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento)
                               && (td.tab_organizacao.Id_organizacao == idOrganizacao)
                               orderby td.dt_documento ascending
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   tipo_pagamento = (td.tab_tipo_pagamento.id_tipo_pagamento == null) ? 0 : td.tab_tipo_pagamento.id_tipo_pagamento,
                                   contrato = (td.tab_contrato.Id_contrato == null) ? 0 : td.tab_contrato.Id_contrato,
                                   organizacao = (td.tab_organizacao.Id_organizacao == null) ? 0 : td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path,
                                   td.dt_documento
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    documento.IdTipoPagamento = list.tipo_pagamento;
                    documento.TipoPagamento = new TipoPagamento(list.tipo_pagamento);
                    documento.IdContrato = list.contrato;
                    documento.idOrganizacao = list.organizacao;
                    documento.Descricao = list.descricao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.DataDocumento = list.dt_documento;
                    documento.Path = list.path;

                    if (list.dt_documento != null || list.dt_documento != DateTime.MinValue)
                    {
                        documento.Ano = DateTime.Parse(list.dt_documento.ToString()).Year.ToString();
                        if (list.Id_tipo_documento == 34 || list.Id_tipo_documento == 37)
                            documento.Mes = "13º.Salário";
                        else if ((list.Id_tipo_documento == 15) && (list.tipo_pagamento == 4) || (list.tipo_pagamento == 5))
                            documento.Mes = "13º.Salário";
                        else
                            documento.Mes = ConverteMes(int.Parse(DateTime.Parse(list.dt_documento.ToString()).Month.ToString()));
                    }

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<OrganizacaoDocumento> SelectPor(int idOrganizacao, int[] pTiposDocumento, int[] pAnosValidade)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = from td in (pAnosValidade[0] != 0) ? _context.tab_documento_organizacao.Where((BuildContainsExpression<tab_documento_organizacao, int>(item => item.validade.Value.Year, pAnosValidade))) : _context.tab_documento_organizacao
                               join tipodocto in _context.tab_tipo_documento.Where((BuildContainsExpression<tab_tipo_documento, int>(item => item.Id_tipo_documento, pTiposDocumento))) on td.tab_tipo_documento.Id_tipo_documento equals tipodocto.Id_tipo_documento
                               where td.tab_organizacao.Id_organizacao == idOrganizacao
                               orderby td.descricao, td.validade
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   tipo_pagamento = (td.tab_tipo_pagamento.id_tipo_pagamento == null) ? 0 : td.tab_tipo_pagamento.id_tipo_pagamento,
                                   contrato = (td.tab_contrato.Id_contrato == null) ? 0 : td.tab_contrato.Id_contrato,
                                   organizacao = (td.tab_organizacao.Id_organizacao == null) ? 0 : td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    documento.IdTipoPagamento = list.tipo_pagamento;
                    documento.IdContrato = list.contrato;
                    documento.idOrganizacao = list.organizacao;
                    documento.Descricao = list.descricao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.Path = list.path;

                    if (list.validade != null || list.validade != DateTime.MinValue)
                    {
                        documento.Ano = DateTime.Parse(list.validade.ToString()).Year.ToString();
                        if (list.Id_tipo_documento == 34 || list.Id_tipo_documento == 37)
                            documento.Mes = "13º.Salário";
                        else if ((list.Id_tipo_documento == 15) && (list.tipo_pagamento == 4) || (list.tipo_pagamento == 5))
                            documento.Mes = "13º.Salário";
                        else
                            documento.Mes = ConverteMes(int.Parse(DateTime.Parse(list.validade.ToString()).Month.ToString()));
                    }

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<OrganizacaoDocumento> SelectPor(int idOrganizacao, int idTipoDocumento, Int16[] pAnosEmissao)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                int[] pAnos = new int[pAnosEmissao.Length];
                for (int i = 0; i < pAnosEmissao.Length; i++)
                {
                    pAnos[i] = pAnosEmissao[i];
                }

                var consulta = from td in (pAnos[0] != 0) ? _context.tab_documento_organizacao.Where((BuildContainsExpression<tab_documento_organizacao, int>(item => item.dt_gravacao.Value.Year, pAnos))) : _context.tab_documento_organizacao
                               where (td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento)
                               && (td.tab_organizacao.Id_organizacao == idOrganizacao)
                               orderby td.descricao, td.validade
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   tipo_pagamento = (td.tab_tipo_pagamento.id_tipo_pagamento == null) ? 0 : td.tab_tipo_pagamento.id_tipo_pagamento,
                                   contrato = (td.tab_contrato.Id_contrato == null) ? 0 : td.tab_contrato.Id_contrato,
                                   organizacao = (td.tab_organizacao.Id_organizacao == null) ? 0 : td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    documento.IdTipoPagamento = list.tipo_pagamento;
                    documento.IdContrato = list.contrato;
                    documento.idOrganizacao = list.organizacao;
                    documento.Descricao = list.descricao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.Path = list.path;

                    if (list.validade != null || list.validade != DateTime.MinValue)
                    {
                        documento.Ano = DateTime.Parse(list.validade.ToString()).Year.ToString();
                        if (list.Id_tipo_documento == 34 || list.Id_tipo_documento == 37)
                            documento.Mes = "13º.Salário";
                        else if ((list.Id_tipo_documento == 15) && (list.tipo_pagamento == 4) || (list.tipo_pagamento == 5))
                            documento.Mes = "13º.Salário";
                        else
                            documento.Mes = ConverteMes(int.Parse(DateTime.Parse(list.validade.ToString()).Month.ToString()));
                    }

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<OrganizacaoDocumento> SelectPor(int idOrganizacao, int idTipoDocumento, int[] pAno, string[] pDescricao)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = from td in (pAno[0] != 0) ? _context.tab_documento_organizacao.Where((BuildContainsExpression<tab_documento_organizacao, int>(item => item.validade.Value.Year, pAno))) : _context.tab_documento_organizacao
                               join td2 in (pDescricao[0] != "0") ? _context.tab_documento_organizacao.Where((BuildContainsExpression<tab_documento_organizacao, string>(item => item.descricao, pDescricao))) : _context.tab_documento_organizacao on td.id_documento_organ equals td2.id_documento_organ
                               where (td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento)
                               && (td.tab_organizacao.Id_organizacao == idOrganizacao)
                               orderby td.descricao, td.validade
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   tipo_pagamento = (td.tab_tipo_pagamento.id_tipo_pagamento == null) ? 0 : td.tab_tipo_pagamento.id_tipo_pagamento,
                                   contrato = (td.tab_contrato.Id_contrato == null) ? 0 : td.tab_contrato.Id_contrato,
                                   organizacao = (td.tab_organizacao.Id_organizacao == null) ? 0 : td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    documento.IdTipoPagamento = list.tipo_pagamento;
                    documento.IdContrato = list.contrato;
                    documento.idOrganizacao = list.organizacao;
                    documento.Descricao = list.descricao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.Path = list.path;

                    if (list.validade != null || list.validade != DateTime.MinValue)
                    {
                        documento.Ano = DateTime.Parse(list.validade.ToString()).Year.ToString();
                        if (list.Id_tipo_documento == 34 || list.Id_tipo_documento == 37)
                            documento.Mes = "13º.Salário";
                        else if ((list.Id_tipo_documento == 15) && (list.tipo_pagamento == 4) || (list.tipo_pagamento == 5))
                            documento.Mes = "13º.Salário";
                        else
                            documento.Mes = ConverteMes(int.Parse(DateTime.Parse(list.validade.ToString()).Month.ToString()));
                    }

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<OrganizacaoDocumento> SelectPor(int idOrganizacao, int idTipoDocumento1, int idTipoDocumento2, int year)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = from td in _context.tab_documento_organizacao
                               where td.tab_organizacao.Id_organizacao == idOrganizacao
                               && (td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento1 || td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento2)
                               && td.validade.Value.Year == year
                               orderby td.validade
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   //td.tab_tipo_pagamento.id_tipo_pagamento,
                                   //td.tab_contrato.Id_contrato,
                                   td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    //if (list.id_tipo_pagamento != null)
                    //    documento.IdTipoPagamento = list.id_tipo_pagamento;
                    //if (list.Id_contrato != null)
                    //    documento.IdContrato = list.Id_contrato;
                    documento.idOrganizacao = list.Id_organizacao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.Path = list.path;
                    documento.Descricao = list.descricao;

                    if (list.validade != null || list.validade != DateTime.MinValue)
                    {
                        documento.Ano = DateTime.Parse(list.validade.ToString()).Year.ToString();
                        if (list.Id_tipo_documento == 34 || list.Id_tipo_documento == 37)
                            documento.Mes = "13º.Salário";
                        else
                            documento.Mes = ConverteMes(int.Parse(DateTime.Parse(list.validade.ToString()).Month.ToString()));
                    }

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<OrganizacaoDocumento> SelectPor(int idOrganizacao, int idTipoDocumento1, int idTipoDocumento2, int[] year)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = from td in _context.tab_documento_organizacao.Where((BuildContainsExpression<tab_documento_organizacao, int>(item => item.validade.Value.Year, year)))
                               where td.tab_organizacao.Id_organizacao == idOrganizacao
                               && (td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento1 || td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento2)
                               orderby td.validade
                               select new
                               {
                                   td.id_documento_organ,
                                   td.tab_tipo_documento.Id_tipo_documento,
                                   //td.tab_tipo_pagamento.id_tipo_pagamento,
                                   //td.tab_contrato.Id_contrato,
                                   td.tab_organizacao.Id_organizacao,
                                   td.descricao,
                                   td.dt_gravacao,
                                   td.validade,
                                   td.path,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.IdDocumentoOrganizacao = list.id_documento_organ;
                    documento.IdTipoDocumento = list.Id_tipo_documento;
                    //if (list.id_tipo_pagamento != null)
                    //    documento.IdTipoPagamento = list.id_tipo_pagamento;
                    //if (list.Id_contrato != null)
                    //    documento.IdContrato = list.Id_contrato;
                    documento.idOrganizacao = list.Id_organizacao;
                    documento.DataGravacao = list.dt_gravacao;
                    documento.DataValidade = list.validade;
                    documento.Path = list.path;
                    documento.Descricao = list.descricao;

                    if (list.validade != null || list.validade != DateTime.MinValue)
                    {
                        documento.Ano = DateTime.Parse(list.validade.ToString()).Year.ToString();
                        if (list.Id_tipo_documento == 34 || list.Id_tipo_documento == 37)
                            documento.Mes = "13º.Salário";
                        else
                            documento.Mes = ConverteMes(int.Parse(DateTime.Parse(list.validade.ToString()).Month.ToString()));
                    }

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<OrganizacaoDocumento> CarregaAno(int idOrganizacao, int idTipoDocumento1, int idTipoDocumento2)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = (from td in _context.tab_documento_organizacao
                                where td.tab_organizacao.Id_organizacao == idOrganizacao
                                && (td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento1 || td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento2)
                                select new
                                {
                                    ano = td.validade.Value.Year
                                }).Distinct();

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.Ano = list.ano.ToString();

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<OrganizacaoDocumento> CarregaAno(int idOrganizacao, int idTipoDocumento1)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = (from td in _context.tab_documento_organizacao
                                where td.tab_organizacao.Id_organizacao == idOrganizacao
                                && td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento1
                                select new
                                {
                                    ano = td.validade.Value.Year
                                }).Distinct();

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.Ano = list.ano.ToString();

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<OrganizacaoDocumento> CarregaAnoDtDoc(int idOrganizacao, int idTipoDocumento1)
        {
            try
            {
                List<OrganizacaoDocumento> listDocumento = new List<OrganizacaoDocumento>();

                var consulta = (from td in _context.tab_documento_organizacao
                                where td.tab_organizacao.Id_organizacao == idOrganizacao
                                && td.tab_tipo_documento.Id_tipo_documento == idTipoDocumento1
                                && td.dt_documento != null
                                select new
                                {
                                    ano = td.dt_documento.Value.Year
                                }).Distinct();

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    OrganizacaoDocumento documento = new OrganizacaoDocumento();
                    documento.Ano = list.ano.ToString();

                    listDocumento.Add(documento);
                }

                return listDocumento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try
            {
                if (_idDocumentoOrganizacao == 0)
                {
                    if (VerificaInclusao())
                    {
                        tab_documento_organizacao tabDocumento = new tab_documento_organizacao();
                        if ((_idTipoDocumento != null) & (_idTipoDocumento != 0))
                            tabDocumento.tab_tipo_documentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_documento", "Id_tipo_documento", _idTipoDocumento);
                        if ((_idTipoPagamento != null) & (_idTipoPagamento != 0))
                            tabDocumento.tab_tipo_pagamentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_pagamento", "id_tipo_pagamento", _idTipoPagamento);
                        if ((_idContrato != null) & (_idContrato != 0))
                            tabDocumento.tab_contratoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_contrato", "Id_contrato", _idContrato);
                        if (_dataGravacao != null)
                            tabDocumento.dt_gravacao = _dataGravacao;
                        if (_dataValidade != null)
                            tabDocumento.validade = _dataValidade;
                        if (_dataDocumento != null)
                            tabDocumento.dt_documento = _dataDocumento;
                        tabDocumento.tab_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao", "Id_organizacao", _idOrganizacao);
                        tabDocumento.descricao = this._descricao;

                        _context.AddTotab_documento_organizacao(tabDocumento);
                        _context.SaveChanges();

                        _idDocumentoOrganizacao = RecuperaId();

                        //Grava Path
                        _nomeArquivo = _idTipoDocumento.ToString() + DateTime.Parse(_dataValidade.ToString()).Month.ToString() + DateTime.Parse(_dataValidade.ToString()).Year.ToString() + ".pdf";
                        AtualizaPath(_idDocumentoOrganizacao, _path + _nomeArquivo);
                    }
                }
                else
                {
                    tab_documento_organizacao tabDocumento = (from td in _context.tab_documento_organizacao
                                                              where td.id_documento_organ == _idDocumentoOrganizacao
                                                              select td).First();

                    if ((_idTipoDocumento != null) & (_idTipoDocumento != 0))
                        tabDocumento.tab_tipo_documentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_documento", "Id_tipo_documento", _idTipoDocumento);
                    if ((_idTipoPagamento != null) & (_idTipoPagamento != 0))
                        tabDocumento.tab_tipo_pagamentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_pagamento", "id_tipo_pagamento", _idTipoPagamento);
                    if ((_idContrato != null) & (_idContrato != 0))
                        tabDocumento.tab_contratoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_contrato", "Id_contrato", _idContrato);
                    if (_dataGravacao != null)
                        tabDocumento.dt_gravacao = _dataGravacao;
                    if (_dataValidade != null)
                        tabDocumento.validade = _dataValidade;
                    if (_dataDocumento != null)
                        tabDocumento.dt_documento = _dataDocumento;
                    tabDocumento.tab_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao", "Id_organizacao", _idOrganizacao);
                    tabDocumento.descricao = this._descricao;

                    //Grava Path
                    _nomeArquivo = _idTipoDocumento.ToString() + DateTime.Parse(_dataValidade.ToString()).Month.ToString() + DateTime.Parse(_dataValidade.ToString()).Year.ToString() + ".pdf";
                    tabDocumento.path = _path + _nomeArquivo;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        //organizacao.SalvarCSLL(idDoc, idTipo1, IdPrestador, ano, tipoTrimestre, tipoPagamento);
        public void SalvarCSLL(int _idDocOrganizacao, int _tipoDocumento, int _organizacao, string ano, int tipoTrimestre, int tipoPagamento, string _caminho)
        {
            try
            {
                switch (_tipoDocumento)
                {
                    case (int)TipoDocumento.TipoDocto.CSLL:
                        this._idDocumentoOrganizacao = _idDocOrganizacao;
                        this._idTipoDocumento = _tipoDocumento;
                        this._idOrganizacao = _organizacao;
                        this._idTipoPagamento = tipoPagamento;

                        switch (tipoTrimestre)
                        {
                            case 1:
                                this._descricao = "Jan/Fev/Mar";
                                switch (tipoPagamento)
                                {
                                    case 6:
                                        this._dataValidade = DateTime.Parse("1/4/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/1/" + ano);
                                        break;
                                    case 7:
                                        this._dataValidade = DateTime.Parse("1/4/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/1/" + ano);
                                        break;
                                    case 8:
                                        this._dataValidade = DateTime.Parse("1/5/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/1/" + ano);
                                        break;
                                    case 9:
                                        this._dataValidade = DateTime.Parse("1/6/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/1/" + ano);
                                        break;
                                    default:
                                        this._dataValidade = DateTime.Now;
                                        this._dataDocumento = DateTime.Now;
                                        break;
                                }
                                break;
                            case 2:
                                this._descricao = "Abr/Mai/Jun";
                                switch (tipoPagamento)
                                {
                                    case 6:
                                        this._dataValidade = DateTime.Parse("1/7/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/4/" + ano);
                                        break;
                                    case 7:
                                        this._dataValidade = DateTime.Parse("1/7/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/4/" + ano);
                                        break;
                                    case 8:
                                        this._dataValidade = DateTime.Parse("1/8/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/4/" + ano);
                                        break;
                                    case 9:
                                        this._dataValidade = DateTime.Parse("1/9/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/4/" + ano);
                                        break;
                                    default:
                                        this._dataValidade = DateTime.Now;
                                        this._dataDocumento = DateTime.Now;
                                        break;
                                }
                                break;
                            case 3:
                                this._descricao = "Jul/Ago/Set";
                                switch (tipoPagamento)
                                {
                                    case 6:
                                        this._dataValidade = DateTime.Parse("1/10/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/7/" + ano);
                                        break;
                                    case 7:
                                        this._dataValidade = DateTime.Parse("1/10/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/7/" + ano);
                                        break;
                                    case 8:
                                        this._dataValidade = DateTime.Parse("1/11/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/7/" + ano);
                                        break;
                                    case 9:
                                        this._dataValidade = DateTime.Parse("1/12/" + ano);
                                        this._dataDocumento = DateTime.Parse("1/7/" + ano);
                                        break;
                                    default:
                                        this._dataValidade = DateTime.Now;
                                        this._dataDocumento = DateTime.Now;
                                        break;
                                }
                                break;
                            case 4:
                                this._descricao = "Out/Nov/Dez";
                                switch (tipoPagamento)
                                {
                                    case 6:
                                        this._dataValidade = DateTime.Parse("1/1/" + (int.Parse(ano) + 1).ToString());
                                        this._dataDocumento = DateTime.Parse("1/10/" + ano);
                                        break;
                                    case 7:
                                        this._dataValidade = DateTime.Parse("1/1/" + (int.Parse(ano) + 1).ToString());
                                        this._dataDocumento = DateTime.Parse("1/10/" + ano);
                                        break;
                                    case 8:
                                        this._dataValidade = DateTime.Parse("1/2/" + (int.Parse(ano) + 1).ToString());
                                        this._dataDocumento = DateTime.Parse("1/10/" + ano);
                                        break;
                                    case 9:
                                        this._dataValidade = DateTime.Parse("1/3/" + (int.Parse(ano) + 1).ToString());
                                        this._dataDocumento = DateTime.Parse("1/10/" + ano);
                                        break;
                                    default:
                                        this._dataValidade = DateTime.Now;
                                        this._dataDocumento = DateTime.Now;
                                        break;
                                }
                                break;
                            default:
                                this._descricao = "";
                                break;
                        }

                        this._dataGravacao = DateTime.Now;
                        this._path = _caminho;
                        break;
                }

                Salvar();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Salvar(int _idDocOrganizacao, int _tipoDocumento, int _organizacao, DateTime? _dtEmissao, int _qtdeDias, string _caminho)
        {
            try
            {
                switch (_tipoDocumento)
                {
                    case (int)TipoDocumento.TipoDocto.CND_ISS_ISSQN:
                        this._idDocumentoOrganizacao = _idDocOrganizacao;
                        this._idTipoDocumento = _tipoDocumento;
                        this._idOrganizacao = _organizacao;
                        this._descricao = "";
                        if (_dtEmissao != null)
                            this._dataGravacao = _dtEmissao;
                        if (_qtdeDias != 0)
                            this.DataValidade = this._dataGravacao.Value.AddDays(double.Parse(_qtdeDias.ToString()));
                        this._path = _caminho;
                        break;
                }

                Salvar();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Salvar(int _idDocOrganizacao, int _tipoDocumento, int _organizacao, DateTime? _dtEmissao, DateTime? _dtValidade, string _caminho)
        {
            try
            {
                switch(_tipoDocumento)
                {
                    case (int)TipoDocumento.TipoDocto.CND_INSS:
                    case (int)TipoDocumento.TipoDocto.CND_CRF:
                    case (int)TipoDocumento.TipoDocto.CND_PGFN:
                        this._idDocumentoOrganizacao = _idDocOrganizacao;
                        this._idTipoDocumento = _tipoDocumento;
                        this._idOrganizacao = _organizacao;
                        this._descricao = "";
                        if (_dtEmissao != null)
                            this._dataGravacao = _dtEmissao;
                        if (_dtValidade != null)
                            this._dataValidade = _dtValidade;
                        this._path = _caminho;
                        break;
                    case (int)TipoDocumento.TipoDocto.PAT:
                        this._idDocumentoOrganizacao = _idDocOrganizacao;
                        this._idTipoDocumento = _tipoDocumento;
                        this._idOrganizacao = _organizacao;
                        this._descricao = "";
                        this._dataGravacao = DateTime.Now;
                        if (_dtValidade != null)
                            this._dataValidade = _dtValidade;
                        this._path = _caminho;
                        break;
                }

                Salvar();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Salvar(int _idDocOrganizacao, int _tipoDocumento, int _organizacao, string _ano, string _caminho)
        {
            try
            {
                switch (_tipoDocumento)
                {
                    case (int)TipoDocumento.TipoDocto.RAIS:
                    case (int)TipoDocumento.TipoDocto.DIRF:
                    case (int)TipoDocumento.TipoDocto.Informe_Rendimentos:
                        this._idDocumentoOrganizacao = _idDocOrganizacao;
                        this._idTipoDocumento = _tipoDocumento;
                        this._idOrganizacao = _organizacao;
                        this._descricao = _ano;
                        this._dataGravacao = DateTime.Now;
                        this._dataValidade = DateTime.Parse("1/" + DateTime.Now.Month.ToString() + "/" + _ano);
                        this._path = _caminho;
                        break;
                }

                Salvar();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Salvar(int _idDocOrganizacao, int _tipoDocumento, int _organizacao, string _ano, string _mes, int _tipoDocumento2, string _caminho)
        {
            try
            {
                switch (_tipoDocumento)
                {
                    case (int)TipoDocumento.TipoDocto.PCMSO:
                    case (int)TipoDocumento.TipoDocto.PPRA:
                    case (int)TipoDocumento.TipoDocto.PSS:
                    case (int)TipoDocumento.TipoDocto.CRSE:
                    case (int)TipoDocumento.TipoDocto.SESMT:
                    case (int)TipoDocumento.TipoDocto.CAGED:
                    case (int)TipoDocumento.TipoDocto.Solidariedade_Fiscal:
                    case (int)TipoDocumento.TipoDocto.Cofins:
                    case (int)TipoDocumento.TipoDocto.IRRF_13:
                    case (int)TipoDocumento.TipoDocto.IRRF_Fer:
                    case (int)TipoDocumento.TipoDocto.IRRF_Res:
                    case (int)TipoDocumento.TipoDocto.IRRF_Sal:
                    case (int)TipoDocumento.TipoDocto.ISS:
                    case (int)TipoDocumento.TipoDocto.PIS_PASEP:
                        this._idDocumentoOrganizacao = _idDocOrganizacao;

                        if (_mes != "13")
                            this._idTipoDocumento = _tipoDocumento;
                        else
                            this._idTipoDocumento = _tipoDocumento2;

                        this._idOrganizacao = _organizacao;
                        this._descricao = _mes + "/" + _ano;
                        this._dataGravacao = DateTime.Now;
                        this._dataValidade = DateTime.Parse("1/" + _mes + "/" + _ano);
                        this._path = _caminho;
                        break;

                    case (int)TipoDocumento.TipoDocto.INSS:
                    case (int)TipoDocumento.TipoDocto.FGTS:
                        this._idDocumentoOrganizacao = _idDocOrganizacao;

                        if (_mes != "13")
                            this._idTipoDocumento = _tipoDocumento;
                        else
                            this._idTipoDocumento = _tipoDocumento2;

                        this._idOrganizacao = _organizacao;
                        this._descricao = _mes + "/" + _ano;
                        this._dataGravacao = DateTime.Now;
                        this._dataValidade = (_mes == "13") ? DateTime.Parse("1/12/" + _ano) : DateTime.Parse("1/" + _mes + "/" + _ano);
                        this._path = _caminho;
                        break;
                }

                Salvar();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Salvar(int _idDocOrganizacao, int _tipoDocumento, int _organizacao, string _ano, string _mes, Int16 _tipoPagamento, string _caminho)
        {
            try
            {
                switch (_tipoDocumento)
                {
                    case (int)TipoDocumento.TipoDocto.Folha_Pagamento:
                        this._idDocumentoOrganizacao = _idDocOrganizacao;
                        this._idTipoDocumento = _tipoDocumento;
                        this._idOrganizacao = _organizacao;
                        this._descricao = _mes;
                        this._dataGravacao = DateTime.Now;

                        switch (this._descricao)
                        {
                            case "13":
                                this._dataValidade = (_tipoPagamento == 4) ? DateTime.Parse("1/11/" + _ano) : DateTime.Parse("1/12/" + _ano);
                                break;
                            default:
                                this._dataValidade = DateTime.Parse("1/" + _mes + "/" + _ano);
                                break;
                        }

                        this._idTipoPagamento = _tipoPagamento;
                        this._path = _caminho;
                        break;
                }

                Salvar();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Excluir()
        {
            //using (TransactionScope scope = new TransactionScope())
            //{
                try
                {
                    var consulta = from doctoorganizacao in _context.tab_documento_organizacao
                                   where doctoorganizacao.id_documento_organ == this._idDocumentoOrganizacao
                                   select doctoorganizacao;

                    var listConsulta = consulta.ToList();

                    string _caminhodoc = "";
                    foreach (var list in listConsulta)
                    {
                        _caminhodoc = list.path;
                        _context.DeleteObject(list);
                        _context.SaveChanges();

                        if ((_caminhodoc != "") && (System.IO.File.Exists(_caminhodoc)))
                            System.IO.File.Delete(_caminhodoc);
                    }

                    //scope.Complete();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            //}
        }

        public void AtualizaPath(int idOrganizacaoDocumento, string path)
        {
            try
            {
                tab_documento_organizacao tabDocumento = (from td in _context.tab_documento_organizacao
                                                          where td.id_documento_organ == idOrganizacaoDocumento
                                                          select td).First();

                tabDocumento.path = path;

                _context.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
